package bancosys.tec.utils.log;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;

import org.apache.log4j.Logger;
import org.apache.log4j.PropertyConfigurator;

import bancosys.tec.utils.loader.ResourceLoader;
import bancosys.tec.utils.loader.ResourceLoaderException;

/**
 * Classe que configura o Log4J.
 * 
 * @created 05/09/2007
 * @author Gustavo Almeida
 */
public class LogManager {
    /**
     * Construtor.
     * 
     * @param resourceLoader carregador de recursos.
     * @param configFile arquivo de configuração do log4j
     * @param userConfigFirst se <code>true</code> e existir o arquivo <code>$HOME/.log4j/log4j.properties</code> esse arquivo será usado no
     * lugar do <code>configFile</code>
     * @throws IOException quando não é possivel ler o arquivo.
     */
    public LogManager(ResourceLoader resourceLoader, String configFile, boolean userConfigFirst) throws IOException {
        Properties config = new Properties();
        InputStream in = null;

        if (userConfigFirst) {
            in = this.loadFromHome();
        }
        if (in == null) {
            try {
                in = resourceLoader.getResourceAsStream(configFile);
            } catch (ResourceLoaderException e) {
                Logger.getLogger(LogManager.class).debug("configuração do log não encontrada: " + configFile);
            }
        }

        if (in != null) {
            config.load(in);
            PropertyConfigurator.configure(config);
        } else {
            Logger.getLogger(LogManager.class).warn("Log4J config not found.");
        }
    }

    /**
     * Construtor, não procura configuração no home do usuário.
     * 
     * @param resourceLoader carregador de recursos.
     * @param configFile arquivo de configuração do log4j
     * @throws IOException quando não é possivel ler o arquivo.
     */
    public LogManager(ResourceLoader resourceLoader, String configFile) throws IOException {
        this(resourceLoader, configFile, false);
    }

    /**
     * Devolve um stream com o conteudo do arquivo de configuração do home do usuario ($HOME/.log4j/log4j.properties) ou <code>null</code>
     * caso ele nao exista.
     * 
     * @return um stream com o conteudo do arquivo de configuração do home do usuario ($HOME/.log4j/log4j.properties) ou <code>null</code>
     * caso ele nao exista.
     */
    protected InputStream loadFromHome() {
        File l4jConfig = new File(System.getProperty("user.home") + File.separator + ".log4j" + File.separator + "log4j.properties");
        try {
            return new FileInputStream(l4jConfig);
        } catch (FileNotFoundException e) {
            System.err.println("unable to find log4j config: " + l4jConfig);
            return null;
        }
    }
}